package br.com.srv.componentes.relatorio.inatividade.service;

import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import br.com.srv.componentes.jdbcdao.DadosLidoJdbcDAO;
import br.com.srv.componentes.relatorio.util.HelperRelatorio;
import br.com.srv.model.PeriodoTO;
import br.com.srv.util.DateHelper;

public class InatividadeServiceImpl implements InatividadeService {
	
	DadosLidoJdbcDAO dadosLidoJdbcDAO;

	public List<Map<String, Object>> consultaInatividade(
			String veiculoId, Long tempoInatividade, PeriodoTO periodoTO) throws Exception {
				
		//pega os dias do intervalo
		List<String> listaDias = DateHelper.getListOfDays(
				periodoTO.getDataInicial(), periodoTO.getDataFinal());
		
		ArrayList<Map<String, Object>> pontosParadas = new ArrayList<Map<String, Object>>();
		
		for (String dia : listaDias) {
			
			Map<String, Object> diaMap = new HashMap<String, Object>(2);
			diaMap.put("dia", dia);
			
			//Pega os pontos do veiculo
			List<Map<String, String>> pontos = getDadosLidoJdbcDAO().consultaPontosByVeiculo(
					veiculoId, dia, periodoTO.getHoraInicial(), periodoTO.getHoraFinal());
			
			Map<String, String> ponto1 = null;
			Map<String, String> ponto2 = null;
			ArrayList<Map<String, Object>> paradas = new ArrayList<Map<String, Object>>(); // Lista de paradas po
			
			for (Map<String, String> ponto : pontos) {
				
				if (ponto1 == null) {
					ponto1 = ponto;
				} else if (ponto2 == null) {
					ponto2 = ponto;
				} else {
					ponto1 = ponto2;
					ponto2 = ponto;
				}

				if (ponto1 != null && ponto2 != null && HelperRelatorio.hasInatividade(ponto1, ponto2, tempoInatividade)) {
					Date data1 = DateHelper.parseDate(DateHelper.REPORT_DATE_DEFAULT, ponto1.get("DATE_TIME").toString());
					Date data2 = DateHelper.parseDate(DateHelper.REPORT_DATE_DEFAULT, ponto2.get("DATE_TIME").toString());
					
					Map<String, Object> parada = new HashMap<String, Object>();
					parada.put("HORA_INICIAL", DateHelper.parseString("HH:mm:ss", data1));
					parada.put("HORA_FINAL", DateHelper.parseString("HH:mm:ss", data2));
					parada.put("DURACAO", HelperRelatorio.extractTimeMillis(ponto1, ponto2));
					parada.put("X1", ponto1.get("X"));
					parada.put("Y1", ponto1.get("Y"));
					parada.put("NEAR_DESC1", ponto1.get("NEAR_DESC"));
					parada.put("X2", ponto2.get("X"));
					parada.put("Y2", ponto2.get("Y"));
					parada.put("NEAR_DESC2", ponto2.get("NEAR_DESC"));
					parada.put("NEAR_DIST", ponto2.get("NEAR_DIST"));
					paradas.add(parada);			
				}
				
			}
			
			paradas.trimToSize();
			diaMap.put("paradas", paradas);
			pontosParadas.add(diaMap);
			
		}
		
		pontosParadas.trimToSize();
		return pontosParadas;

	}

	public DadosLidoJdbcDAO getDadosLidoJdbcDAO() {
		return dadosLidoJdbcDAO;
	}

	public void setDadosLidoJdbcDAO(DadosLidoJdbcDAO dadosLidoJdbcDAO) {
		this.dadosLidoJdbcDAO = dadosLidoJdbcDAO;
	}		

}
